package com.atguigu.educenter.controller;

import com.atguigu.commonutils.JwtUtils;
import com.atguigu.educenter.entity.UcenterMember;
import com.atguigu.educenter.service.UcenterMemberService;
import com.atguigu.educenter.utils.ConstantWxUtils;
import com.atguigu.educenter.utils.HttpClientUtils;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;

/**
 * @author ct_start
 * @create 2021 -08 -21
 **/
@CrossOrigin
@Controller
@RequestMapping("/api/ucenter/wx")
public class WxApiController {

    @Autowired
    private UcenterMemberService ucenterMemberService;

    // 2. 获取扫描人信息 从这里获取信息

    @GetMapping("callback")
    public String  callback (String code,String state){
        // 先获取到code 值, 临时票据,类似于验证码



        // 2 拿着code 请求微信固定地址,得到 accsess_token 和 openid
        //向认证服务器发送请求换取access_token
        String baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                "?appid=%s" +
                "&secret=%s" +
                "&code=%s" +
                "&grant_type=authorization_code";


        // 拼接参数 appid 和 密钥
        String accessTokenUrl = String.format(baseAccessTokenUrl,
                ConstantWxUtils.WX_OPEN_APP_ID,
                ConstantWxUtils.WX_OPEN_APP_SECRET,
                code);
        // 使用 httpclient 发送请求,得到返回结果(可以不使用浏览器,也可以模拟出浏览器的响应和请求过程)
        String s = null;
        try {
             s= HttpClientUtils.get(accessTokenUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 取出里面的token 和 openid

//        System.out.println("第一次"+s);

        // 使用json 转换工具
        Gson gson = new Gson();
        HashMap map = gson.fromJson(s,
                HashMap.class);

        String accessToken = (String)map.get("access_token");

        String openid = (String)map.get("openid");


        UcenterMember ucenterMember=ucenterMemberService.getOpenId(openid);

        if (ucenterMember==null) {
            // 拿着这个 token 和 openid 再去请求微信的固定地址,得到扫码人的信息
            String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                    "?access_token=%s" +
                    "&openid=%s";
            String userInfoUrl = String.format(baseUserInfoUrl, accessToken, openid);

            // 再发送请求,请求用户的信息
            String UserInfo = null;
            try {
                UserInfo = HttpClientUtils.get(userInfoUrl);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //System.out.println("第二次"+UserInfo);
            // 得到了这个值里面包含了,头像,id 和昵称.我们需要把这个值加入到数据库中

            // 进行goson 转换得到里面的数据
            HashMap hashMap = gson.fromJson(UserInfo, HashMap.class);
            String nickname = (String) hashMap.get("nickname"); // 昵称
            String headimgurl = (String) hashMap.get("headimgurl"); // 头像

            // 再把这个值存在数据库里面,返回token
            // 判断数据表里面是否有相同的信息,根据openid 进行判断


            //向数据库中插入一条记录
            ucenterMember = new UcenterMember();
            ucenterMember.setNickname(nickname);
            ucenterMember.setOpenid(openid);
            ucenterMember.setAvatar(headimgurl);
            ucenterMemberService.save(ucenterMember);
        }

        //使用jwt根据member对象生成token字符串
        String jwtToken = JwtUtils.getJwtToken(ucenterMember.getId(), ucenterMember.getNickname());
        //最后：返回首页面，通过路径传递token字符串
        return "redirect:http://localhost:3000?token="+jwtToken;
    }




    // 1生成微信二维码 直接请求微信的址值
    @GetMapping("login")
    public String getWxCode(){
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +
                "&state=%s" +
                "#wechat_redirect";
        // 对 redirect_url 进行URLEncoder编码, 就是把特殊符号进行处理
        String wxOpenRedirectUrl = ConstantWxUtils.WX_OPEN_REDIRECT_URL;
        try {
            wxOpenRedirectUrl = URLEncoder.encode(wxOpenRedirectUrl,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        // 设置s% 里面的值
        String url = String.format(
                baseUrl,
                ConstantWxUtils.WX_OPEN_APP_ID,
                wxOpenRedirectUrl,
                "atguigu");


        // 直接请求重定向,跳转到微信二维码
        return "redirect:"+url;
    }
}
